var fs = require('fs');

// convertit dtstart et dtend en Objet Date pour pouvoir comparer
function icalToDate(ligne)
{
	var debut = ligne.slice(ligne.indexOf(":") + 1 );
	var annee = debut.substr(0,4);
	var mois = parseInt(debut.substr(4,2),10)-1;
	var jour = debut.substr(6,2);
	var heure = debut.substr(9,2);
	var minute = debut.substr(11,2);
	var sec = debut.substr(13,2);

	return new Date(annee,mois, jour, heure, minute, sec);
}

//retourne vrai si il y a un conflit entre 2 evenements
//d1 debut evenement 1
//d2 debut evenement 2
//f1 fin evenement 1
//f2 fin evenement 2

function testDate(d1,d2,f1,f2)
{
	return((d2 <= d1 && d1 < f2) || (d2 < f1 && f1 <= f2) || (d2 <= d1 && f2 >= f1));
}

function afficherDoublons(icalendar){
	fs.exists(file, function(exists) {
		if (exists) {
			fs.readFile(icalendar, 'utf8', function (err,data) {
			  if (err) {
					return console.log(err);
			  }
			  var isValide = true; 
			  //on decoupe le fichier en events dans un tableau
			  var events = data.split("BEGIN:VEVENT");
			//tabD est un tableau contenant les dates de debut d'evenements dans l'ordre, les fins sont dans tabF
			  var tabD = [];
			  var tabF = [];
			// la premiere case est le debut du fichier si il est conforme, on la supprime du tableau d'evemenement
			  events.shift();
			
			  var nbEvents = events.length;
			  //on parcourt les events jusqu'a la fin on stocke les dates debuts dans tabD et les dates fin dans tabF
			  for(var event = 0; event < nbEvents ; event++ ){
			  
					//on lit le VEVENT      
					var lignes = events[event].split("\n");
					var ligneDebut = "";
					var ligneFin = "";
					var index=0;
					//on parcourt le VEVENT
					while(index<lignes.length){
							//on verifie si la ligne commence par DTSTART ou DTEND
							if(lignes[index].lastIndexOf("DTSTART:", 0) === 0){
									ligneDebut = lignes[index];
							} else if (lignes[index].lastIndexOf("DTEND:", 0) === 0){
									ligneFin = lignes[index];
							}
							index++;
					}
					
					// creation d'un objet date (pour faciliter la comparaison plus tard)
					var DateDebut =  icalToDate(ligneDebut);
					tabD.push(DateDebut);
					// on stocke les dates debuts dans tabD et les dates fin dans tabF
					var DateFin =  icalToDate(ligneFin);
					tabF.push(DateFin);
					
					}
					//parcours de tous les events pour comparer
					for(var i=0;i<nbEvents;i++){
							//pour chaque event, on le compare avec tous les autres
							for(var j=i;j<nbEvents;j++){
									// on affiche entre quels doublons l'erreur se produit
									if(testDate(tabD[i],tabD[j],tabF[i], tabF[j]) && i!=j){
											console.log("Erreur de doublons sur les évènements numéros ", (i+1), " et ",(j+1)+".");
											isValide = false;
									}
							}
					}
					if(isValide)
							console.log("Le fichier est valide");
			});
		} else {
			console.log("ERREUR : fichier inexistant");
		}
	});
}
var file = process.argv[2]; //on récupère le fichier passé en argument

if(file==null || file.split(".").pop()!="ics"){
	console.log("ERREUR : vous devez entrer un fichier .ICS à exploiter.");
}else{
	afficherDoublons(file);
}